package offer.offer01;

/**
 *
 */
public class S14剪绳子 {
    /**
     * 每次分割都是分割成2和3的组合才能得到最大的结果, 尝试使用递推证明。
     * 要切成大于1份, 所以长度为2时返回1, 长度为3时返回2;
     */
    public int cuttingRope(int n) {
        if(n <= 3) return n==2? 1: 2;
        int a = n/3;
        int b = n%3;
        switch (b) {
            case 0 -> {
                return (int) Math.pow(3.0, (double) a);
            }
            case 1 -> {
                float tmp1 = (float) Math.pow(3.0, (double) a) * 4 / 3;
                return (int) tmp1;
            }
            case 2 -> {
                return (int) Math.pow(3.0, (double) a) * 2;
            }
            default -> {
                return -1;
            }
        }
    }
    //学习一下他的表达方式, 这也行?还是普通表达比较合适。
    public int cuttingRope2(int n) {
        if(n == 2) return 1;
        if(n == 3) return 2;

        double numOf3 = n / 3;
        int yu = n % 3;
        if(yu == 0) return (int) Math.pow(3, numOf3);
        else if(yu == 2) return (int) (2*Math.pow(3, numOf3));
        else return (int) (2*2*Math.pow(3, numOf3-1));
    }
}
